{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# MNIST 手寫數字辨識使用卷積神經網絡(CNN)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![cnn](https://www.cntk.ai/jup/cntk103d_convonly2.png)\n",
    "\n",
    "圖片出處:[CNTK_103D_MNIST_ConvolutionalNeuralNetwork](https://cntk.ai/pythondocs/CNTK_103C_MNIST_MultiLayerPerceptron.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CNN 卷積神經網路簡介\n",
    "\n",
    "### STEP1. 卷積神經網路介紹\n",
    "\n",
    "CNN 卷積神經網路可以分成兩大部分:\n",
    "* 影像的特徵提取: 透過 Convolution 與 Max Pooling 提取影像特徵.\n",
    "* Fully connected Feedforward network: Flatten layers, hidden layers and output layers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![cnn](https://2.bp.blogspot.com/-lo4ANmafiQM/WVpEeo68VPI/AAAAAAAAWxE/7FJBUGp-GrQFL5fUYEg6tQAJWXUHrtgWgCLcBGAs/s1600/3812_1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP2. 卷積運算 (Convolution) \n",
    "\n",
    "卷積運算的原理是將一個影像透過卷積運算的 Filter weight(s) 產生多個影像, 在上面第一層的 Convolution 為例: \n",
    "1. 先以隨機方式產生 16 個 3x3 的 filter weight(s) \n",
    "2. 要轉換的影像由左而右, 由上而下透過 filter weight 產生新影像的值\n",
    "3. 使用 16 個 filter weight 產生 16 個影像 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![convolution](https://4.bp.blogspot.com/-65gO4Ylb-pU/WVpEj04De1I/AAAAAAAAWxI/Y3wX2OYjzJYddDYCaH24-Swmhj7Q9U8iACLcBGAs/s1600/3591_1.PNG)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP3. 池化運算 (Max-Pooling) \n",
    "Max-Pool 運算可以將影像縮減取樣 (downsampling), 如下圖: 原本影像是 4x4, 經過 Max-Pool 運算後, 影像大小為 2x2: "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![maxpool](https://4.bp.blogspot.com/-HCaeeLJ9PSI/WVpEpg-qWiI/AAAAAAAAWxM/v4Qg8BAHuxAaC9Eoe2JZWY8jdt_vyCy8gCLcBGAs/s1600/3591_2.PNG)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "downsampling 有以下好處: \n",
    "* 減少需要處理的資料點: 減少後續運算所需時間.\n",
    "* 讓影像位置的差異變小: 例如手寫數字 7, 位置上下左右可能不同, 但是位置不同可能影響辨識. 減少影像大小讓數字的位置差異變小.\n",
    "* 參數的數量和計算量下降: 這在一定程度上也控制了 Overfitting 的狀況."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 進行資料前處理 (Preprocess) \n",
    "CNN (Convolution Neural Network) 與 MLP 進行資料的前處理方式有所不同, 說明如下: \n",
    "\n",
    "* MLP : image reshape (60000, 784): MLP 因為直接送進神經元處理, 所以 60,000 筆的每一筆圖像(28x28)轉換為 784 個神經元輸入。\n",
    "* CNN : image reshape (60000, 28, 28, 1): CNN 因為必須先進行卷積與池化 (Max-Pool) 運算, 所以必須保留影像的維度. 因此 60,000 筆的每一筆圖像(28x28)轉換成 28 (長) x 28(寬) x 1(圖像頻道) 的影像單位。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP1. 資料讀取與轉換"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.datasets import mnist  \n",
    "from keras.utils import np_utils  \n",
    "import numpy as np\n",
    "\n",
    "np.random.seed(10)  \n",
    "  \n",
    "# Read MNIST data  \n",
    "(X_Train, y_Train), (X_Test, y_Test) = mnist.load_data()  \n",
    "  \n",
    "# Translation of data  \n",
    "X_Train4D = X_Train.reshape(X_Train.shape[0], 28, 28, 1).astype('float32')  \n",
    "X_Test4D = X_Test.reshape(X_Test.shape[0], 28, 28, 1).astype('float32')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP2. 將 Features 進行標準化與 Label 的 Onehot encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Standardize feature data  \n",
    "X_Train4D_norm = X_Train4D / 255  \n",
    "X_Test4D_norm = X_Test4D /255  \n",
    "  \n",
    "# Label Onehot-encoding  \n",
    "y_TrainOneHot = np_utils.to_categorical(y_Train)\n",
    "y_TestOneHot = np_utils.to_categorical(y_Test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建立模型(卷積神經網絡 CNN)\n",
    "\n",
    "接著會依照下面流程圖建立模型:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![cnn](https://4.bp.blogspot.com/-lo4ANmafiQM/WVpEeo68VPI/AAAAAAAAWxE/gVT33Q_dxqMxqZJfnbxS-fxl7ZdsntZcwCEwYBhgL/s1600/3812_1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP1. 建立卷積層與池化層"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from keras.models import Sequential  \n",
    "from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D \n",
    "\n",
    "model = Sequential()  \n",
    "# Create CN layer 1  \n",
    "model.add(Conv2D(filters=16,  \n",
    "                 kernel_size=(5,5),  \n",
    "                 padding='same',  \n",
    "                 input_shape=(28,28,1),  \n",
    "                 activation='relu',\n",
    "                 name='conv2d_1')) \n",
    "# Create Max-Pool 1  \n",
    "model.add(MaxPool2D(pool_size=(2,2), name='max_pooling2d_1'))  \n",
    "  \n",
    "# Create CN layer 2  \n",
    "model.add(Conv2D(filters=36,  \n",
    "                 kernel_size=(5,5),  \n",
    "                 padding='same',  \n",
    "                 input_shape=(28,28,1),  \n",
    "                 activation='relu',\n",
    "                 name='conv2d_2'))  \n",
    "  \n",
    "# Create Max-Pool 2  \n",
    "model.add(MaxPool2D(pool_size=(2,2), name='max_pooling2d_2'))  \n",
    "  \n",
    "# Add Dropout layer  \n",
    "model.add(Dropout(0.25, name='dropout_1'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP2. 建立神經網路"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 建立平坦層 \n",
    "下面程式碼建立平坦層, 將之前步驟已經建立的池化層2, 共有 36 個 7x7 維度的影像轉換成 1 維向量, 長度是 36x7x7 = 1764, 也就是對應到 1764 個神經元: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.add(Flatten(name='flatten_1'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 建立 Hidden layer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.add(Dense(128, activation='relu', name='dense_1'))  \n",
    "model.add(Dropout(0.5, name='dropout_2'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 建立輸出層\n",
    "\n",
    "最後建立輸出層, 共有 10 個神經元, 對應到 0~9 共 10 個數字. 並使用 softmax 激活函數 進行轉換 (softmax 函數可以將神經元的輸出轉換成每一個數字的機率):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.add(Dense(10, activation='softmax', name='dense_2'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP3. 查看模型的摘要"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_1 (Conv2D)            (None, 28, 28, 16)        416       \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 14, 14, 36)        14436     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 7, 7, 36)          0         \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 7, 7, 36)          0         \n",
      "_________________________________________________________________\n",
      "flatten_1 (Flatten)          (None, 1764)              0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 128)               225920    \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 242,062\n",
      "Trainable params: 242,062\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "\n"
     ]
    }
   ],
   "source": [
    "model.summary()  \n",
    "print(\"\")  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![cnn](https://3.bp.blogspot.com/-fHmURvhoPGE/WVpEw-lv1HI/AAAAAAAAWxQ/oClbewBNDTc6YRL9iWbzL67ZwZ2FAWyygCLcBGAs/s1600/3591_3.PNG)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 進行訓練\n",
    "接著我們使用 Back Propagation 進行訓練。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP1. 定義訓練並進行訓練"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 48000 samples, validate on 12000 samples\n",
      "Epoch 1/10\n",
      "48000/48000 [==============================] - 98s - loss: 0.4874 - acc: 0.8477 - val_loss: 0.0964 - val_acc: 0.9722\n",
      "Epoch 2/10\n",
      "48000/48000 [==============================] - 105s - loss: 0.1409 - acc: 0.9587 - val_loss: 0.0634 - val_acc: 0.9799\n",
      "Epoch 3/10\n",
      "48000/48000 [==============================] - 105s - loss: 0.1029 - acc: 0.9690 - val_loss: 0.0517 - val_acc: 0.9837\n",
      "Epoch 4/10\n",
      "48000/48000 [==============================] - 107s - loss: 0.0851 - acc: 0.9747 - val_loss: 0.0456 - val_acc: 0.9862\n",
      "Epoch 5/10\n",
      "48000/48000 [==============================] - 103s - loss: 0.0717 - acc: 0.9785 - val_loss: 0.0397 - val_acc: 0.9868\n",
      "Epoch 6/10\n",
      "48000/48000 [==============================] - 101s - loss: 0.0648 - acc: 0.9807 - val_loss: 0.0394 - val_acc: 0.9884\n",
      "Epoch 7/10\n",
      "48000/48000 [==============================] - 104s - loss: 0.0566 - acc: 0.9829 - val_loss: 0.0418 - val_acc: 0.9873\n",
      "Epoch 8/10\n",
      "48000/48000 [==============================] - 100s - loss: 0.0513 - acc: 0.9844 - val_loss: 0.0341 - val_acc: 0.9903\n",
      "Epoch 9/10\n",
      "48000/48000 [==============================] - 103s - loss: 0.0451 - acc: 0.9864 - val_loss: 0.0341 - val_acc: 0.9904\n",
      "Epoch 10/10\n",
      "48000/48000 [==============================] - 105s - loss: 0.0430 - acc: 0.9870 - val_loss: 0.0342 - val_acc: 0.9901\n"
     ]
    }
   ],
   "source": [
    "# 定義訓練方式  \n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  \n",
    "  \n",
    "# 開始訓練  \n",
    "train_history = model.fit(x=X_Train4D_norm,  \n",
    "                          y=y_TrainOneHot, validation_split=0.2,  \n",
    "                          epochs=10, batch_size=300, verbose=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在 compile 方法中: \n",
    "* loss: 設定 Loss Function, 這邊選定 Cross Entropy 作為 Loss Function.\n",
    "* optimizer: 設定訓練時的優化方法, 在深度學習使用 adam (Adam: A Method for Stochastic Optimization) 可以更快收斂, 並提高準確率.\n",
    "* metrics: 設定評估模型的方式是 accuracy 準確率."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP2. 畫出 accuracy 執行結果\n",
    "\n",
    "之前的訓練步驟產生的 accuracy 與 loss 都會記錄在 train_history 變數. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt  \n",
    "def plot_image(image):  \n",
    "    fig = plt.gcf()  \n",
    "    fig.set_size_inches(2,2)  \n",
    "    plt.imshow(image, cmap='binary')  \n",
    "    plt.show()  \n",
    "  \n",
    "def plot_images_labels_predict(images, labels, prediction, idx, num=10):  \n",
    "    fig = plt.gcf()  \n",
    "    fig.set_size_inches(12, 14)  \n",
    "    if num > 25: num = 25  \n",
    "    for i in range(0, num):  \n",
    "        ax=plt.subplot(5,5, 1+i)  \n",
    "        ax.imshow(images[idx], cmap='binary')  \n",
    "        title = \"l=\" + str(labels[idx])  \n",
    "        if len(prediction) > 0:  \n",
    "            title = \"l={},p={}\".format(str(labels[idx]), str(prediction[idx]))  \n",
    "        else:  \n",
    "            title = \"l={}\".format(str(labels[idx]))  \n",
    "        ax.set_title(title, fontsize=10)  \n",
    "        ax.set_xticks([]); ax.set_yticks([])  \n",
    "        idx+=1  \n",
    "    plt.show()  \n",
    "  \n",
    "def show_train_history(train_history, train, validation):  \n",
    "    plt.plot(train_history.history[train])  \n",
    "    plt.plot(train_history.history[validation])  \n",
    "    plt.title('Train History')  \n",
    "    plt.ylabel(train)  \n",
    "    plt.xlabel('Epoch')  \n",
    "    plt.legend(['train', 'validation'], loc='upper left')  \n",
    "    plt.show() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用函數 show_train_history 顯示 accuracy 在 train 與 evaluation 的差異與 loss 在 train 與 evaluation 的差異如下: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x89c8b70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_train_history(train_history, 'acc', 'val_acc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x89c8b00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "show_train_history(train_history, 'loss', 'val_loss')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 評估模型準確率與進行預測\n",
    "\n",
    "我們已經完成訓練, 接下來要使用 test 測試資料集來評估準確率。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP1. 評估模型準確率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 9984/10000 [============================>.] - ETA: 0s\n",
      "\t[Info] Accuracy of testing data = 99.1%\n"
     ]
    }
   ],
   "source": [
    "scores = model.evaluate(X_Test4D_norm, y_TestOneHot)  \n",
    "print()  \n",
    "print(\"\\t[Info] Accuracy of testing data = {:2.1f}%\".format(scores[1]*100.0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP2. 預測結果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\t[Info] Making prediction of X_Test4D_norm\n",
      " 9984/10000 [============================>.] - ETA: 0s\n",
      "\t[Info] Show 10 prediction result (From 240):\n",
      "[5 9 8 7 2 3 0 4 4 2]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"\\t[Info] Making prediction of X_Test4D_norm\")  \n",
    "prediction = model.predict_classes(X_Test4D_norm)  # Making prediction and save result to prediction  \n",
    "print()  \n",
    "print(\"\\t[Info] Show 10 prediction result (From 240):\")  \n",
    "print(\"%s\\n\" % (prediction[240:250]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### STEP3. 顯示前 10 筆預測結果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAOCt/wc8f4gmZBTC+QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x89c8a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_images_labels_predict(X_Test, y_Test, prediction, idx=240)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 總結 (Conclusion)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在這篇文章中有一些個人學習到的一些有趣的重點:\n",
    "\n",
    "* Mnist的手寫資料集雖然很簡單, 但對很多不熟悉把圖像處理的人來說, Mnist絕對是一個合適用來做練習與講解的好資料集\n",
    "* 需要了解網絡的結構與不同網絡層輸入輸出的張量的結構才能夠清楚地構建一個對的模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "參考:\n",
    "* [程式扎記-Keras - MNIST 手寫數字辨識使用 CNN](http://puremonkey2010.blogspot.tw/2017/06/toolkit-keras-mnist.html)\n",
    "* [林大貴 - TensorFlow+Keras深度學習人工智慧實務應用](http://tensorflowkeras.blogspot.com)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
